<?php
/**
 * La classe User gestisce i singoli utenti per 
 * effettuare la registrazione, l'accesso e le operazione su dati critici quali 
 * password, email, data di nascita e citt�
 *
 * @author Stefano Poncini
 * @version 1.0
 */

class User{

	public $id;
	public $name;
	public $surname;
	public $email;
	public $password;
	public $level;
	public $activation_id;
	public $last_page;
	public $old_password;
	public $new_password;
	public $account_activated;
	
	function __construct(){
		$this->account_activated = 0;
		$this->last_page = null;
	}
	
	function login($email, $password){
	
        // Preparo la query per cercare nel DB un utente con email e password corrispondenti ai dati immessi dall'utente su login
        $sql = "SELECT `u`.`ID_USER`, `u`.`surname`, `u`.`name`, `u`.`email`, `u`.`password`, `u`.`level`, `u`.`active` 
        		FROM `user` AS `u` 
        		WHERE `u`.`email` = ? AND `u`.`password` = ? ";

        // Eseguo la query per tratte i risultati
        $result = Database::getInstance()->getConnection()->Execute($sql, array($email, $password));
        		
        // Se non ha trovato solo un record esce altrimenti vuoi dire che hai dati immessi corrisponde un solo utente, quindi estrapola tutti i dati di esso
		if($result->NumRows() != 1){
			return false;
		}else{
			
			$row = $result->FetchRow();
			// Carico i dati dell'utente nelle variabili di classe

			$this->id = $row['ID_USER'];
			$this->name = $row['name'];
			$this->surname = $row['surname'];
			$this->email = $email;
			$this->password = $password;	
			$this->level = $row['level'];
			$this->account_activated = $row['active'];
			
			$result->close();
						
			$this->setSession();
			header("Location: index.php");
			
			return $this->id;	
		}
	}
	
	function logout(){
		if($this->isLogged()) {
			session_destroy();
			header("Location: index.php");
			
			return true;
		}else{
			return false;
		}
	}
	
	function toDB(){
		
		// Preparazione della query per la creazione dell'utente
		$sql = "INSERT INTO `user` VALUES('NULL', ?, ?, ?, ?, ?, ?, ?)";

        // Inserimento dell'utente nel DB
		$result = Database::getInstance()->getConnection()->Execute($sql, array($this->name, $this->surname, $this->email, $this->password, $this->level, $this->activation_id, $this->last_page));
		
		
		if(!Database::getInstance()->getConnection()->Insert_ID()) {
			return false;
		
		}else{
			return Database::getInstance()->getConnection()->Insert_ID();
			
		}
		
		$result->close();
	}
	
	function setSession(){
		$_SESSION['user'] = serialize($this);
	}
	
	function isLogged(){
		if(isset($_SESSION['user'])){
			return true;
		}else{
			return false;
		}
	}
	
	function validateField($field, $value){
		switch ($field) {
			case "name":
				if(strlen($value)<3 OR strlen($value)>40){
					return false;
				}else{
					return true;
				}
			break;
			case "surname":
				if(strlen($value)<3 OR strlen($value)>40){
					return false;
				}else{
					return true;
				}
				break;
			case "email":
				if(!preg_match('/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/', $value) OR $value == ""){
					return false;
				}else{
					return true;
				}
			break;
			case "emailFree":
				// Preparazione della query per la ricerca dell'email inserito dall'utente
				$sql = "SELECT * 
						FROM `user` 
						WHERE `email` = ?";
		
		        // Query di controllo per l'email univoca
				$result = Database::getInstance()->getConnection()->Execute($sql, array($value));
				
				// Se il numero di righe a risultato � pari a 0 vuol dire che nessun  si � ancora registato con l'email inserita dall'utente
				if($result->NumRows() > 0) {
					return false;
				}else{
					return true;
				}
				$result->close();
			break;
			case "password":
				if($value == ""){
					return false;
				}else{
					return true;
				}
			break;
			case "old_password":
				// Preparazione della query per la ricerca dell'attuale password dell'utente
				$sql = "SELECT * 
						FROM `user` 
						WHERE `password` = ? AND `ID_USER` = ?";
		
		        // Query di controllo per la password
				$result = Database::getInstance()->getConnection()->Execute($sql, array($value, $this->id));
				
				// Se il numero di righe a risultato � maggiore di zero vuol dire che la password inserita dall'utente � la sua attuale.
				if($result->NumRows() > 0) {
					return true;
				}else{
					return false;
				}
				$result->close();
				
			break;
			
		}
	}
	
	function getUsername(){
		return $this->name . ' ' . $this->surname;
	}
	
	function getUserLevel(){
		switch($this->level){
			case 1: 
				return 'Administrator';
			break;
			case 2: 
				return 'Moderatore';
			break;
			case 3: 
				return 'User';
			break;
			default:
				return 'User';
			break;
		}
	}
        
        function isAdmin(){
            if($this->level == 1){ // 1 == admin; 0 == user;
                return true;
            }else{
                return false;
            }
        }
	
	function updatePassword(){
		// Preparazione della query per la ricerca dell'email inserito dall'utente
		$sql = "UPDATE `user` 
				SET `password` = ?
				WHERE `user`.`ID_USER` = ?";

        // Query di controllo per l'email univoca
		$result = Database::getInstance()->getConnection()->Execute($sql, array($this->new_password, $this->id));
		
		// Se il numero di righe a risultato � pari a 0 vuol dire che nessun  si � ancora registato con l'email inserita dall'utente
		if(!Database::getInstance()->getConnection()->Affected_Rows()) {
			return false;
		}else{
			return Database::getInstance()->getConnection()->Affected_Rows();
		}
		
		$result->close();
		
	}
	
	function getUser($id){
		// Preparazione della query per ricavare i dati dell'utente
		$sql = "SELECT * FROM `user` WHERE `ID_USER` = ?";
		
        // Query di estrapolazione dati dell'utente
		$result = Database::getInstance()->getConnection()->Execute($sql, array($id));
		
		// Elaborazione dati
		$row = $result->FetchRow();
		
		$result->close();
		// Ritorna Nome Cognome [ Es. Stefano Poncini ]
		return $row['name'] . ' ' . $row['surname'];
		
		
	}
	
	function generateActivationID(){
		$this->activation_id = md5($this->email);
	}
	
	function getActivationID($email){
		
		// Preparazione della query per ricavare il codice di attivazione account
		$sql = "SELECT `activation_id` 
				FROM `user` 
				WHERE `email` = ?";

        // Query di ricavo dati
		$result = Database::getInstance()->getConnection()->Execute($sql, array($email));
		
		// Elaborazione dati
		if($result->NumRows() != 1){
			return false;
		}else{
			$row = $result->FetchRow();
			return $row['activation_id'];
		}
		
		$result->close();

		
	}
	
	function activeAccount($email){
		// Preparazione della query per attivare l'account
		$sql = "UPDATE `user` 
				set `active` = ? 
				WHERE `email` = ?";

        // Attivazione dell'account
		$result = Database::getInstance()->getConnection()->Execute($sql, array(1,$email));
		
		return $result;
		
		$result->close();
			
		
	}
	
	function isActiveUser($email){
		$sql = "SELECT `ID_USER`, `password`, `active` FROM `user` WHERE `email` = ?";
		
		$result = Database::getInstance()->getConnection()->Execute($sql, array($email));
		
		if($result->NumRows() != 1){
			return false;
		}else{
			return $result;
		}
		
		$result->close();
		
	}
}

?>